package cn.edu.swu.miniwebsvr.core;

import cn.edu.swu.miniwebsvr.handler.DefaultHandler;
import cn.edu.swu.miniwebsvr.handler.EchoHandler;
import cn.edu.swu.miniwebsvr.handler.TimeHandler;
import java.util.HashMap;
import java.util.Map;

public class Config {
    private final int port = 8080;
    private final String webRoot = "webroot";
    private final Map<String, Handler> handlerMap = new HashMap<>();

    private Config() {
        handlerMap.put("/", new DefaultHandler());
        handlerMap.put("/time", new TimeHandler());
        handlerMap.put("/echo", new EchoHandler());
    }

    public static Config getInstance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static final Config INSTANCE = new Config();
    }

    public int getPort() {
        return port;
    }

    public String getWebRoot() {
        return webRoot;
    }

    public Handler getHandler(String url) {
        // [学222024321072026罗玉婷] 实现 URL 精确匹配或基础路径匹配逻辑

        // 1. 首先尝试精确匹配
        if (handlerMap.containsKey(url)) {
            return handlerMap.get(url);
        }

        // 2. 如果精确匹配失败，尝试基础路径匹配
        // 例如：/time/xxx -> /time, /echo/test -> /echo
        String basePath = extractBasePath(url);
        if (basePath != null && handlerMap.containsKey(basePath)) {
            return handlerMap.get(basePath);
        }

        // 3. 如果都没有匹配到，返回默认处理器
        return handlerMap.get("/");
    }

    /**
     * 从URL中提取基础路径
     * @param url 请求的URL
     * @return 基础路径，如果没有基础路径则返回null
     */
    private String extractBasePath(String url) {
        if (url == null || url.isEmpty() || url.equals("/")) {
            return null;
        }

        // 移除查询参数
        int queryIndex = url.indexOf('?');
        if (queryIndex != -1) {
            url = url.substring(0, queryIndex);
        }

        // 查找第二个斜杠的位置
        int secondSlashIndex = url.indexOf('/', 1);
        if (secondSlashIndex != -1) {
            // 返回基础路径，例如 "/time/xxx" -> "/time"
            return url.substring(0, secondSlashIndex);
        }

        // 如果URL本身就是一个基础路径，直接返回
        if (handlerMap.containsKey(url)) {
            return url;
        }

        return null;
    }

    /**
     * 注册新的处理器（可选扩展功能）
     * @param path 路径
     * @param handler 处理器
     */
    public void registerHandler(String path, Handler handler) {
        if (path != null && handler != null) {
            handlerMap.put(path, handler);
        }
    }

    /**
     * 获取所有已注册的处理器路径（用于调试或监控）
     * @return 所有注册的路径
     */
    public String[] getRegisteredPaths() {
        return handlerMap.keySet().toArray(new String[0]);
    }
}